'''
@Company: TWL
@Author: xue jian
@Email: xuejian@kanzhun.com
@Date: 2020-06-23 21:11:44
'''
'''
你的国家有无数个湖泊，所有湖泊一开始都是空的。当第 n 个湖泊下雨的时候，如果第 n 个湖泊是空的，那么它就会装满水，否则这个湖泊会发生洪水。你的目标是避免任意一个湖泊发生洪水。

给你一个整数数组 rains ，其中：

rains[i] > 0 表示第 i 天时，第 rains[i] 个湖泊会下雨。
rains[i] == 0 表示第 i 天没有湖泊会下雨，你可以选择 一个 湖泊并 抽干 这个湖泊的水。
请返回一个数组 ans ，满足：

ans.length == rains.length
如果 rains[i] > 0 ，那么ans[i] == -1 。
如果 rains[i] == 0 ，ans[i] 是你第 i 天选择抽干的湖泊。
如果有多种可行解，请返回它们中的 任意一个 。如果没办法阻止洪水，请返回一个 空的数组 。

请注意，如果你选择抽干一个装满水的湖泊，它会变成一个空的湖泊。但如果你选择抽干一个空的湖泊，那么将无事发生（详情请看示例 4）。

'''

class Solution:
    def avoidFlood(self, rains: List[int]) -> List[int]:
        def search(start, end, norain):
            # print(norain)
            i = 0
            j = len(norain)-1
            while i<=j:
                media = (i+j)//2
                if norain[media] < start:
                    i = media+1
                elif norain[media]>end:
                    j = media-1
                else:
                    re = norain[media]
                    del(norain[media])
                    return re, True
            return 0, False
        re = [-1]*len(rains)
        norain = []
        lake_day = {}
        for i, rain in enumerate(rains):
            if rain == 0:
                re[i] = 1
                norain.append(i)
            else:
                
                if rain not in lake_day:
                    lake_day[rain] = i
                else:
                    start = lake_day[rain]
                    end = i
                    ind, test = search(start, end, norain)
                    if not test:
                        return []
                    lake_day[rain]=i
                    re[ind] = rain
        return re    

if __name__ == "__main__":
    solution = Solution()
    exam = [1,2,0,0,2,1]
    solution.avoidFlood(exam)